iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
JavaScript

JavaScript 基礎:端開發的第一步系列 第 29

實戰練習 - 編寫一個使用回呼函數的小應用程式

  • 分享至 

  • xImage
  •  

應用說明

我們將模擬一個任務調度器,使用者可以排隊執行不同的任務,每個任務將使用回呼函數來模擬它們完成的時間。當任務完成後,會呼叫指定的回呼函數來執行相應的動作。


功能需求:

  1. 新增任務:使用者可以新增不同的任務,並設定每個任務的執行時間。
  2. 執行任務:當使用者點擊「執行任務」時,系統會依次執行每個任務,模擬任務的耗時操作。
  3. 回呼函數:每個任務完成後會執行一個回呼函數,通知使用者該任務已完成。

開發步驟

1. HTML 結構

我們首先創建一個基本的 HTML 框架,包含新增任務的輸入框、執行按鈕和顯示結果的區域。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>回呼函數範例</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
      padding: 20px;
    }
    #taskList {
      margin-top: 20px;
      list-style: none;
      padding: 0;
    }
    .task {
      padding: 10px;
      border: 1px solid #ddd;
      margin-bottom: 5px;
    }
    button {
      padding: 5px 10px;
      font-size: 1rem;
    }
  </style>
</head>
<body>

  <h1>回呼函數應用</h1>

  <label for="taskInput">任務名稱:</label>
  <input type="text" id="taskInput" placeholder="任務名稱">
  <label for="timeInput">執行時間(秒):</label>
  <input type="number" id="timeInput" placeholder="秒數">
  <button id="addTaskBtn">新增任務</button>
  <button id="executeBtn">執行任務</button>

  <ul id="taskList"></ul>

  <div id="result"></div>

  <script src="callbackApp.js"></script>
</body>
</html>

2. JavaScript 邏輯 (callbackApp.js)

接下來,我們編寫 JavaScript,來實現新增任務、執行任務以及回呼函數的邏輯。

let taskInput = document.getElementById('taskInput');
let timeInput = document.getElementById('timeInput');
let addTaskBtn = document.getElementById('addTaskBtn');
let executeBtn = document.getElementById('executeBtn');
let taskList = document.getElementById('taskList');
let result = document.getElementById('result');

let tasks = [];

// 新增任務
addTaskBtn.addEventListener('click', () => {
  let taskName = taskInput.value.trim();
  let taskTime = parseInt(timeInput.value);

  if (taskName === '' || isNaN(taskTime) || taskTime <= 0) {
    alert('請輸入有效的任務名稱與時間');
    return;
  }

  tasks.push({ name: taskName, time: taskTime });

  let taskItem = document.createElement('li');
  taskItem.classList.add('task');
  taskItem.textContent = `任務:${taskName},耗時:${taskTime} 秒`;
  taskList.appendChild(taskItem);

  taskInput.value = '';
  timeInput.value = '';
});

// 執行任務(使用回呼函數)
executeBtn.addEventListener('click', () => {
  if (tasks.length === 0) {
    alert('沒有任務可執行');
    return;
  }

  result.textContent = '開始執行任務...';

  executeTasks(tasks, () => {
    result.textContent = '所有任務已完成!';
  });
});

// 執行任務的函數,使用回呼函數來處理完成後的動作
function executeTasks(taskQueue, callback) {
  if (taskQueue.length === 0) {
    callback(); // 當所有任務執行完畢後,呼叫回呼函數
    return;
  }

  let currentTask = taskQueue.shift(); // 取出第一個任務
  result.textContent = `正在執行:${currentTask.name}`;

  setTimeout(() => {
    result.textContent = `${currentTask.name} 完成!`;
    executeTasks(taskQueue, callback); // 遞迴調用,執行下一個任務
  }, currentTask.time * 1000); // 模擬任務的執行時間
}

功能解析:

  1. 新增任務

    • 透過 taskInputtimeInput 取得任務名稱和執行時間,並將它們新增到 tasks 陣列中。
    • 動態顯示新增的任務至頁面上,讓使用者可以看到所有排隊中的任務。
  2. 執行任務

    • 當使用者點擊「執行任務」時,會開始依次執行每個任務,模擬每個任務的執行時間(使用 setTimeout)。
    • 每個任務完成後,會呼叫 executeTasks() 再次執行下一個任務,直到所有任務完成後執行回呼函數。
  3. 回呼函數

    • 當所有任務都執行完畢後,會呼叫回呼函數來通知使用者任務已經完成。
    • executeTasks() 函數中的回呼函數是為了在所有任務執行結束後觸發「所有任務已完成」的訊息。
  4. 非同步操作

    • 使用 setTimeout 來模擬非同步任務的耗時操作,這也是常見的回呼函數使用情境,例如處理非同步 API 請求。

小改進:

  • 進度顯示:可以顯示剩餘的任務數量或進度條,讓使用者更直觀地了解任務執行進度。

  • 錯誤處理:可以加入錯誤回呼函數,模擬在執行任務時發生的錯誤處理流程。


實戰要點:

  • 回呼函數:這是 JavaScript 處理非同步任務的核心技術之一,透過回呼函數可以在任務完成後執行相應的動作。
  • 非同步操作setTimeout 是模擬非同步操作的好方法,讓你熟悉如何管理執行流程。
  • 陣列操作:利用 shift() 來取出任務並執行,並在每次任務完成後遞迴呼叫下一個任務。

上一篇
任務管理應用
下一篇
JavaScript 開發最佳實踐
系列文
JavaScript 基礎:端開發的第一步30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言